<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="kSjYF" id="kSjYF"><span data-lake-id="u0466d9da" id="u0466d9da">典型回答</span></h1>
  <p data-lake-id="udfd8bbd4" id="udfd8bbd4"><br></p>
  <p data-lake-id="u0889c591" id="u0889c591"><br></p>
  <p data-lake-id="u54bd12e1" id="u54bd12e1"><span data-lake-id="ud7f58395" id="ud7f58395">使用乐观锁在对数据库进行处理的时候，乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。</span></p>
  <p data-lake-id="u75c5b534" id="u75c5b534"><span data-lake-id="u3b505585" id="u3b505585">​</span><br></p>
  <p data-lake-id="u9b8460b3" id="u9b8460b3"><span data-lake-id="u7a1ded72" id="u7a1ded72">这是我们前面的文章中提到的一句话，但是，如果你认为乐观锁的这个过程中完全没有任何锁的参与的话那就大错特错了。</span></p>
  <p data-lake-id="u92343a13" id="u92343a13"><span data-lake-id="u9b8ce777" id="u9b8ce777">​</span><br></p>
  <p data-lake-id="u9201f510" id="u9201f510"><span data-lake-id="u884c9ea5" id="u884c9ea5">因为虽然在使用乐观锁的时候，我们没有显式的加锁，也没有用到对他的相关锁机制。但是乐观锁是使用updata语句过程中实现的，update的过程是有锁的。</span></p>
  <p data-lake-id="ubab6c7ac" id="ubab6c7ac"><span data-lake-id="ub1001694" id="ub1001694">​</span><br></p>
  <p data-lake-id="ua8824fd1" id="ua8824fd1"><span data-lake-id="uf1a97b88" id="uf1a97b88">数据库在更新时，会根据where条件中是否包含索引考虑加锁范围，如果有索引，那么就使用索引添加行级锁（可能还有gap 或者 next key），如果没有索引 ，那么就会添加表级锁。</span></p>
  <p data-lake-id="u50cbd87f" id="u50cbd87f"><span data-lake-id="ufe5c2257" id="ufe5c2257">​</span><br></p>
  <p data-lake-id="u24dd871c" id="u24dd871c"><span data-lake-id="ucbbad16c" id="ucbbad16c">所以，乐观锁的过程中，并不是完全无锁的。</span></p>
  <p data-lake-id="ue774c62c" id="ue774c62c"><span data-lake-id="u3e2ed28d" id="u3e2ed28d">​</span><br></p>
  <p data-lake-id="u1114ea64" id="u1114ea64"><span data-lake-id="u99d1fd1b" id="u99d1fd1b">那么，乐观锁既然也有锁，那么他相比悲观锁意义在哪里呢？</span></p>
  <p data-lake-id="u7be841df" id="u7be841df"><span data-lake-id="u8c5d5593" id="u8c5d5593">​</span><br></p>
  <p data-lake-id="u5bf43322" id="u5bf43322"><span data-lake-id="ua1f68bee" id="ua1f68bee">乐观锁最大的好处就是通过CAS的方式做并发校验，这个过程不需要提前加锁，只需要在更新的那一刻加一个短暂的锁而已，而悲观锁的话，需要你先select for update，锁的时长要长得多。</span></p>
 </body>
</html>